package tp2;
	import java.io.BufferedReader;
	import java.io.File;
	import java.io.*;
	import java.io.FileReader;
	import java.io.FileWriter;
	import java.io.IOException;
	

public class Parser2 {
	static int cantOp = 0;
		private Estadistica es;
		
		public Parser2(){
			es = new Estadistica();
		}
		
		public static void main(String[] args) 
		{
			Parser2 parser = new Parser2(); 
			File fileIn = new File("Tp2Ej3.in");
			File fileOut = new File("Tp2Ej3.out");
			File grafo = new File("Grafo.dat");
			File cantOpA = new File("cantOpAgregar.out");
			File cantOpP = new File("cantOpPertenece.out");
			File cantOpS = new File("cantOpSacar.out");
			PatriciaTrie p = new PatriciaTrie(parser.es);
			FileReader fr = null;
			FileWriter fw = null;
			FileWriter fwG = null;
			FileWriter fwOpA = null;
			FileWriter fwOpP = null;
			FileWriter fwOpS = null;
			
			try {
				fr = new FileReader(fileIn);
				BufferedReader in = new BufferedReader(fr);
				fwOpA = new FileWriter(cantOpA);
				BufferedWriter outA = new BufferedWriter(fwOpA); 
				fwOpP = new FileWriter(cantOpP);
				BufferedWriter outP = new BufferedWriter(fwOpP); 
				fwOpS = new FileWriter(cantOpS);
				BufferedWriter outS = new BufferedWriter(fwOpS); 
				fw = new FileWriter(fileOut);
				fwG = new FileWriter(grafo);

				levantoDatos(parser,in,fw,outA,outP,outS,p);
				fwG.write("digraph G {");
				escribirGrafo(fwG, p.raiz());
				fwG.write("}");
			} catch (IOException e) {
				System.out.println("NO SE PUDO LEER EL ARCHIVO");
				e.printStackTrace();
			} finally {
				try {
					if ( fr != null )
						fr.close();
				} catch (IOException e) {
					System.out.println("Error al cerrar el archivo de entrada");
				}

				try {
					if ( fw != null )
						fw.close();
				} catch (IOException e) {
					System.out.println("Error al cerrar el archivo de salida");
				}
				try {
					if ( fwG != null )
						fwG.close();
				} catch (IOException e) {
					System.out.println("Error al cerrar el archivo grafo");
				}
				try {
					if ( fwOpA != null )
						fwOpA.close();
				} catch (IOException e) {
					System.out.println("Error al cerrar el archivo cantOp");
				}
				try {
					if ( fwOpP != null )
						fwOpP.close();
				} catch (IOException e) {
					System.out.println("Error al cerrar el archivo cantOp");
				}
				try {
					if ( fwOpS != null )
						fwOpS.close();
				} catch (IOException e) {
					System.out.println("Error al cerrar el archivo cantOp");
				}
			}
		}
		private static void escribirGrafo(FileWriter fwG, TrieNode p)throws NumberFormatException,
		IOException {
			for(TrieNode tn: p._hijos){
				escribirGrafo(fwG,tn);
			}
			StringBuffer str = new StringBuffer();
			if(p._padre != null && p._padre._clave != null){
	
			str.append(" \" ");
			str.append(p._padre._clave.toString());
			str.append(" \" ");
			str.append("->");
			str.append(" \" ");
			str.append(p._clave.toString());
			str.append(" \" ");
			fwG.write(str.toString());
			}
		
		}
private static void levantoDatos(Parser2 parser,BufferedReader br, FileWriter fw,BufferedWriter fwOpA,BufferedWriter fwOpP,BufferedWriter fwOpS,PatriciaTrie p) throws NumberFormatException,
		IOException {
		
			String cantInstrucciones = new String();

			cantInstrucciones =  br.readLine();
     		Integer contador = new Integer(0);
			if ( cantInstrucciones==null || cantInstrucciones.equals("0"))
				return;
	while(cantInstrucciones !=null && !cantInstrucciones.equals("0")){
	//		if(!cantInstrucciones.equals("0")){
			contador = contador.valueOf(cantInstrucciones);
			StringBuffer str = new StringBuffer();
	
			for (int i = 0; i < contador.intValue(); i++) 
			{
				// tengo en temp la instruccion y el valor
				String[] temp = new String[2];
				temp = br.readLine().trim().split("\\s+");

				if(temp[0].equals("agregar")){
					parser.es.op = 0;
					p.definir(new StringC(temp[1],parser.es));
					StringBuffer strOpA = new StringBuffer();
					strOpA.append(temp[1].length() + " ");
					strOpA.append(parser.es.op);
					fwOpA.write(strOpA.toString());
					fwOpA.newLine();
					fwOpA.flush();
					System.out.println("Agregue!");
					parser.es.op = 0;
				}

				if(temp[0].equals("sacar")){
					parser.es.op = 0;
					p.borrar(new StringC(temp[1],parser.es));
				
					StringBuffer strOpS = new StringBuffer();

					strOpS.append(temp[1].length() + " ");
				
					strOpS.append(parser.es.op);
					fwOpS.write(strOpS.toString());
					fwOpS.newLine();
					fwOpS.flush();
				
				 
				 
				parser.es.op = 0;
				}
				if(temp[0].equals("pertenece")){
					parser.es.op = 0;
					StringBuffer strOp = new StringBuffer();
					if(p.estaDefinido(new StringC(temp[1],parser.es))){
						
						System.out.println("esta!");
							str.append(1) ;
					}
						else{ 
							str.append(0);
							System.out.println("no esta!");
						}
					strOp.append(temp[1].length() + " ");
					strOp.append(parser.es.op);
					fwOpP.write(strOp.toString());
					fwOpP.newLine();
					fwOpP.flush();
					
					str.append(" ");
					parser.es.op = 0;
				}
				if(temp[0].equals("cardinal")){
					str.append(p.cantPalabras());
					str.append(" ");
					System.out.println(p.cantPalabras());
				}
			}
			fw.write(str.toString());
			fw.write("\n");
			fw.flush();
	//		}
//			else{
				p = new PatriciaTrie(parser.es);
	//}
			cantInstrucciones = br.readLine();
	}
}

}